package br.com.localfloripa.dao;

import java.util.List;

import javax.inject.Inject;
import javax.inject.Named;
import javax.persistence.Query;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.context.annotation.Scope;

import br.com.localfloripa.entities.Mensagem;
import br.com.localfloripa.entities.Usuario;

@Named("mensagemDao")
@Scope("singleton")
public class MensagemDao extends DaoManager<Mensagem> {
	
	private static final Logger log = LoggerFactory.getLogger(MensagemDao.class);

	@Inject
	@Named("representanteDao")
	private RepresentanteDao representanteDao;
	
	public Mensagem findById(Long idMensagem) throws Exception {
		return em.find(Mensagem.class, idMensagem);
	}
	
	public List<Mensagem> listMensagensEncaminhar() throws Exception {
		
		Query query = em.createQuery("SELECT m FROM Mensagem m WHERE m.encaminhado IS FALSE");		
		return query.getResultList();
		
	}
	
	public List<Mensagem> listMensagensPaginada(int pagina, int max) throws Exception { //corretor
		
		String jpql = null;
		if (representanteDao.findById(Usuario.getLoggedUser().getCliente().getId()) != null) {
			jpql = "SELECT m FROM Mensagem m LEFT JOIN m.anuncio a WHERE a.representante.id = :idCliente ORDER BY m.nome";
		} else {
			jpql = "SELECT m FROM Mensagem m LEFT JOIN m.anuncio.cliente c WHERE c.id = :idCliente ORDER BY m.nome";
		}
				
		Query query = em.createQuery(jpql);
		query.setParameter("idCliente", Usuario.getLoggedUser().getCliente().getId());		
		query.setFirstResult(pagina);
		query.setMaxResults(max);
		return query.getResultList();
	}
	
	public Long countListMensagens() throws Exception {
		
		String jpql = null;
		if (representanteDao.findById(Usuario.getLoggedUser().getCliente().getId()) != null) { //corretor
			jpql = "SELECT COUNT(m.id) FROM Mensagem m LEFT JOIN m.anuncio a WHERE a.representante.id = :idCliente";
		} else {
			jpql = "SELECT COUNT(m.id) FROM Mensagem m LEFT JOIN m.anuncio.cliente c WHERE c.id = :idCliente";
		}
		
		Query query = em.createQuery(jpql);		
		query.setParameter("idCliente", Usuario.getLoggedUser().getCliente().getId());
		return (Long) query.getSingleResult();
	}
	

}
